package br.com.ged.web;

import java.util.ArrayList;
import java.util.List;

import javax.faces.FacesException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.model.UploadedFile;

import br.com.ged.aplicacao.AdministradorArquivos;
import br.com.ged.dominio.Arquivo;


@ManagedBean
@SessionScoped
public class ArquivoFace {
	AdministradorArquivos administradorArquivos = new AdministradorArquivos();
	private Arquivo pojoSelecionado = new Arquivo();
	private List<Arquivo> listaPojosCacheados;
	private String resultado;
	private ArrayList<String> migalhas = new ArrayList<String>();
	
	private UploadedFile file;
	
	/*
	 * As mensagens de erro serão armazenadas em um ArrayList Observe que o
	 * nosso código é adaptado para o Java 5 podendo ser rodado sobre um JVM 1.4
	 * com algumas adaptações no código.
	 */
	private ArrayList<String> errorMessages = new ArrayList<String>();

	public ArquivoFace() {
		System.out.println("*******************************************\n\n"+
				"Iniciando com o arquivo: \n"
				+ "\nID: " + pojoSelecionado.getId()
				+ "\nNOME: " + pojoSelecionado.getNome()
				+ "\nDATA CRIAÇÃO: " + pojoSelecionado.getDataCriacao()
				+ "\nDATA ALTERAÇÃO: " + pojoSelecionado.getDataAlteracao()
				+ "\nDATA REMOÇÃO: " + pojoSelecionado.getDataRemocao()
				+"\n\n*******************************************\n\n");
	}

	/*
	 * Este é o método getErrorMessages() que verifica as mensagens de arquivos no
	 * objeto ArrayList errorMessages e devolve a variavel tipo String message
	 * concatenada.
	 */

	public String getErrorMessages() {
		String message = "";

		if (errorMessages.size() > 0) {
			for (int i = 0; i < errorMessages.size(); i++) {
				message = message + (String) errorMessages.get(i);
			}
		}
		return (message);
	}

	public List<Arquivo> listarTodos() {
		if (listaPojosCacheados == null)
			listaPojosCacheados = administradorArquivos.carregarTodos();
		if (listaPojosCacheados.isEmpty())
			adicionarAlerta("Nenhum registro encontrado!!!");
		else
			setResultado(listaPojosCacheados.size() + " registros encontrados");
		return listaPojosCacheados;
	}

	public Arquivo getPojoSelecionado() {
		return pojoSelecionado;
	}

	public void setPojoSelecionado(Arquivo pojo) {
		this.pojoSelecionado = pojo;
	}

	public String novo() {
		pojoSelecionado = new Arquivo();
		return "/pages/arquivo/crud";
	}

/*	public String editar() {
		System.out.println("Editando o registro: " + pojoSelecionado.getTitle());
		return null;
	}*/
	
	/*public String editarListenerAction(ActionEvent ae) {
		System.out.println("Editando o registro: " + pojoSelecionado.getTitle());
		return null;
	}*/

	public String excluir() throws FacesException {
		administradorArquivos.remover(pojoSelecionado);
		adicionarAlerta("Arquivo (" + pojoSelecionado.getNome()
				+ ") removido com sucesso!");
		listaPojosCacheados = null;
		return null;
	}

	public String salvar() throws FacesException {
		
		System.out.println("*******************************************\n\n"+
				"(FACE) Salvando o arquivo: \n"
				+ "\nID: " + pojoSelecionado.getId()
				+ "\nNOME: " + pojoSelecionado.getNome()
				+ "\nDATA CRIAÇÃO: " + pojoSelecionado.getDataCriacao()
				+ "\nDATA ALTERAÇÃO: " + pojoSelecionado.getDataAlteracao()
				+ "\nDATA REMOÇÃO: " + pojoSelecionado.getDataRemocao()
				+"\n\n*******************************************\n\n");
		
		pojoSelecionado.setCaminhoFisico(file.getFileName());
		
		administradorArquivos.cadastrar(pojoSelecionado);
		
		if(file != null) {  
			adicionarAlerta("Arquivo (" + pojoSelecionado.getNome() + ") enviado com sucesso!");
		}
		
		adicionarAlerta("Arquivo (" + pojoSelecionado.getNome() + ") salvo com sucesso!");
		listaPojosCacheados = null;
		pojoSelecionado = new Arquivo();
		return null;
	}
	
	public String adicionar() throws FacesException {
		
		administradorArquivos.cadastrar(pojoSelecionado);
		
		adicionarAlerta("Arquivo (" + pojoSelecionado.getNome()
				+ ") cadastrado com sucesso!");
		listaPojosCacheados = null;
		pojoSelecionado = new Arquivo();
		return null;
	}

	public String alterar() throws FacesException {
		
		administradorArquivos.atualizar(pojoSelecionado);
		adicionarAlerta("Arquivo (" + pojoSelecionado.getNome()
				+ ") atualizado com sucesso!");
		listaPojosCacheados = null;
		return null;
	}

	public String listar() {
		listaPojosCacheados = getListaPojosCacheados();
		if (listaPojosCacheados.isEmpty()) {
			adicionarAlerta("Nenhum registro encontrado!!!");
		} else {
			errorMessages.clear();
			setResultado(listaPojosCacheados.size() + " registros encontrados");
		}
		return "/pages/arquivo/crud";
	}

	public List<Arquivo> getListaPojosCacheados() {
		if (listaPojosCacheados == null)
			listaPojosCacheados = administradorArquivos.carregarTodos();
		return listaPojosCacheados;
	}

	public void setListaPojosCacheados(List<Arquivo> listaPojosCacheados) {
		this.listaPojosCacheados = listaPojosCacheados;
	}

	public void adicionarAlerta(String alerta) {
		errorMessages.clear();
		errorMessages.add(alerta);
	}

	public void setResultado(String resultado) {
		this.resultado = resultado;
	}

	public String getResultado() {
		return resultado;
	}

	public void addMigalha(String nomeArquivo){
		migalhas.add(nomeArquivo);
	}
	
	/*
	 * Este é o método getMigalhas() que verifica a lista de arquivos no
	 * objeto ArrayList migalhas e devolve a variavel tipo String message
	 * concatenada com o caractere "/".
	 */

	public String getMigalhas() {
		String breadcrumbs = "/";

		if (migalhas.size() > 0) {
			for (int i = 0; i < migalhas.size(); i++) {
				breadcrumbs = breadcrumbs + (String) migalhas.get(i);
			}
		}
		return (breadcrumbs);
	}
	
	public UploadedFile getFile() {  
        return file;  
    }  
  
    public void setFile(UploadedFile file) {  
        this.file = file;  
    }
}
